package com.yejiali.backend.util;

import com.yejiali.backend.entity.vo.CommentVO;
import com.yejiali.backend.entity.vo.MyTreeNode;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.List;

/**
 * @Author:yejiali
 * @Date:2025/7/26-07-26-11:57
 * @Decsription:com.yejiali.backend.util
 * @Version:1.0
 */
@Component
public class TreeUtils {
    //创建树的实现逻辑
    public  MyTreeNode buildTree(List<CommentVO> commentVoList){
        //创建主根节点 id为0
        MyTreeNode root = MyTreeNode.buildRoot();
        //根节点的子节点列表（也就是所有的一级评论）
        List<MyTreeNode> rootChildren=new ArrayList<>();
        //存放所有评论节点的列表
        List<MyTreeNode> nodes=new ArrayList<>();
        for (CommentVO commentVo : commentVoList) {
            MyTreeNode TreeNode = MyTreeNode.buildNode(commentVo);
            nodes.add(TreeNode);
        }
        for (MyTreeNode node : nodes) {
            //为每一个节点找它的父节点
            MyTreeNode parentNode=findParentNode(node,nodes);
            //存在父节点
            if(parentNode!=null){
                //父节点的孩子列表为空，则现在添加的这个孩子是该父节点的第一个孩子
                if(parentNode.getChildren()==null){
                    //创建一个孩子列表
                    List<MyTreeNode> children=new ArrayList<>();
                    //添加该子节点
                    children.add(node);
                    //设置孩子列表
                    parentNode.setChildren(children);
                }else{
                    //说明已有孩子加入，直接添加
                    parentNode.getChildren().add(node);
                }
                //不存在父节点，即为一级评论
            }else{
                //加入一个评论的列表，作为主根节点的子节点
                rootChildren.add(node);
                //将一级评论的父节点设为主根节点
                node.setParentId(root.getId());
            }
            //添加主根节点的孩子列表（一级评论）
            root.setChildren(rootChildren);
        }
        return root;
    }
    //找到子节点的父节点
    public MyTreeNode findParentNode(MyTreeNode childNode,List<MyTreeNode> allNodes){
        //遍历所有节点
        for (MyTreeNode node : allNodes) {
            //查看是否有节点的id等于该child节点的父节点id
            if(childNode.getParentId().equals(node.getId())){
                //拿到该父节点的孩子列表
                List<CommentVO> fatherCommentVoList = node.getContent().getChildComments();
                if(fatherCommentVoList==null){
                    fatherCommentVoList=new ArrayList<>();
                    fatherCommentVoList.add(childNode.getContent());
                    node.getContent().setChildComments(fatherCommentVoList);
                }else{
                    node.getContent().getChildComments().add(childNode.getContent());
                }
                //添加此节点的父亲节点
                childNode.setParentId(node.getId());
                return node;
            }
        }
        return null;

    }
}

